<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="rPX3W" id="rPX3W"><span data-lake-id="u01e120c7" id="u01e120c7">典型回答</span></h1>
  <p data-lake-id="ub6de5f6e" id="ub6de5f6e"><br></p>
  <p data-lake-id="u73941a49" id="u73941a49"><span data-lake-id="u2a75d645" id="u2a75d645">执行计划中，key有值，并且type=index，这时候很多人认为是走了索引的。</span></p>
  <p data-lake-id="u06bcee0c" id="u06bcee0c"><strong><span data-lake-id="u97dcdfd3" id="u97dcdfd3">​</span></strong><br></p>
  <p data-lake-id="u5b91e32f" id="u5b91e32f"><span data-lake-id="uffd8a381" id="uffd8a381">当我们执行执行计划查看一个SQL的执行过程的时候，通常会见到以下这样的执行计划：</span></p>
  <p data-lake-id="u6ead034f" id="u6ead034f"><span data-lake-id="u29a6384b" id="u29a6384b">​</span><br></p>
  <pre lang="java"><code>
+----+-------+---------------+----------+--------------------------+                                           
| id | type  | possible_keys | key      | Extra                    |                                           
+----+-------+---------------+----------+--------------------------+                                           
|  1 | index | NULL          | idx_abcd | Using where; Using index |                                           
+----+-------+---------------+----------+--------------------------+ 
</code></pre>
  <p data-lake-id="ud1daef92" id="ud1daef92"><br></p>
  <p data-lake-id="uae8ac789" id="uae8ac789"><br></p>
  <p data-lake-id="u17c75b0a" id="u17c75b0a"><span data-lake-id="u1aea085a" id="u1aea085a">这个执行计划中，</span><code data-lake-id="u4dec68c0" id="u4dec68c0"><span data-lake-id="ue74fc080" id="ue74fc080">type=index,key=idx_abcd</span></code><span data-lake-id="u90155b8c" id="u90155b8c">很多人会认为这表示这条SQL走了索引，但是其实这么理解是不对的。</span></p>
  <p data-lake-id="ude28cf0d" id="ude28cf0d"><span data-lake-id="uf9012420" id="uf9012420">​</span><br></p>
  <p data-lake-id="u29ae7093" id="u29ae7093"><span data-lake-id="u8e2f2e29" id="u8e2f2e29">如果是走了索引Extra中的内容应该是</span><code data-lake-id="u1df96447" id="u1df96447"><span data-lake-id="uca96ffe0" id="uca96ffe0">Using index </span></code><span data-lake-id="u4c70c0ed" id="u4c70c0ed">而不是</span><code data-lake-id="uc6ae8376" id="uc6ae8376"><span data-lake-id="ud3e7df89" id="ud3e7df89">Using where; Using index </span></code></p>
  <p data-lake-id="u62c7eaab" id="u62c7eaab"><span data-lake-id="u9ab511ac" id="u9ab511ac">​</span><br></p>
  <p data-lake-id="u2283f6ff" id="u2283f6ff"><span data-lake-id="ubb5ccfc1" id="ubb5ccfc1">以上的这个执行计划表明，这个SQL确实用到了idx_abcd的这个索引树，但是他并没有直接通过索引进行匹配或者范围查询，而是扫描了整颗索引树。</span></p>
  <p data-lake-id="u4e1e0837" id="u4e1e0837"><span data-lake-id="ue42e64d4" id="ue42e64d4">​</span><br></p>
  <p data-lake-id="u42c7e260" id="u42c7e260"><span data-lake-id="ua139a3e5" id="ua139a3e5">所以，</span><code data-lake-id="u45b09850" id="u45b09850"><span data-lake-id="u87e78408" id="u87e78408">type=index</span></code><span data-lake-id="u071a8a17" id="u071a8a17"> 意味着进行了全索引扫描， 会遍历索引树来查找匹配的行，这个效率比扫表扫描快一些，但是很有限，和我们通常意义上理解的</span><span data-lake-id="u93445ba3" id="u93445ba3" style="color: #DF2A3F">走了索引 </span><span data-lake-id="u60891de3" id="u60891de3">是两回事儿。</span></p>
  <p data-lake-id="u9b7e4716" id="u9b7e4716"><span data-lake-id="u35b32dc9" id="u35b32dc9">​</span><br></p>
  <p data-lake-id="u32bfcb94" id="u32bfcb94"><span data-lake-id="u21da164c" id="u21da164c">遇到这种情况，大概率是因为没有遵守最左前缀匹配导致的索引失效了。所以需要调整查询语句，或者修改索引来解决。</span></p>
 </body>
</html>